package com.example.demo.controller;

/**
 * Controller中必须做的两件事
 * 1.对参数的校验（非空，业务中必须的校验规则）
 * 2.构造对象，调用Service
 */

import com.example.demo.common.AppResult;
import com.example.demo.common.ResultCode;
import com.example.demo.config.AppConfig;
import com.example.demo.model.User;
import com.example.demo.service.IUserService;
import com.example.demo.utils.MD5Utils;
import com.example.demo.utils.UUIDUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Api(tags = "用户接口")
@Slf4j
@RestController //返回具体数据的控制器
@RequestMapping("/user") //一级映射路径
public class UserController {

    @Resource
    private IUserService userService;

    @ApiOperation("用户注册")
    @PostMapping("/register")
    //@ApiParam()是API中对参数的描述
    //@RequestParam()是URL请求的参数名，参数列表中的参数名
    //@NonNULL接收参数是做非空校验，否则要写if(StringUtils.isEmpty(username...)
    //最后面的username代表代码中的变量
    public AppResult register(@ApiParam("用户名") @RequestParam("username") @NonNull String username,
                              @ApiParam("昵称") @RequestParam("nickname") @NonNull String nickname,
                              @ApiParam("密码") @RequestParam("password") @NonNull String password,
                              @ApiParam("确认密码") @RequestParam("passwordRepeat") @NonNull String passwordRepeat){

        // 1.判断密码与确认密码是否相同
        if(!password.equals(passwordRepeat)){
            //返回错误信息
            return AppResult.failed(ResultCode.FAILED_TWO_PWD_NOT_SAME);
        }
        // 2.判断用户是否存在
        User existsUser = userService.selectByUsername(username);
        if(existsUser != null){
            //用户已存在
            return AppResult.failed(ResultCode.FAILED_USER_EXISTS);
        }
        // 3.生成密码的密文
        // 生成盐
        String salt = UUIDUtils.UUID_32();
        //生成密文
        String ciphertext = MD5Utils.md5Salt(password,salt);

        // 构造User对象
        User user = new User();
        user.setUsername(username);//用户名
        user.setNickname(nickname);//昵称
        user.setPassword(ciphertext);//加密加盐的密码
        user.setSalt(salt);//盐

        //调用Service
        userService.createNormalUser(user);
        //返回正常响应
        return AppResult.success();
    }

    @ApiOperation("用户登录")
    @PostMapping("/login")
    //request把登录成功的用户信息放在Session中,那么就需要从Request对象中获取Session对象
    public AppResult<User> login(HttpServletRequest request,
                                 @ApiParam("用户名") @RequestParam("username") @NonNull String username,
                                 @ApiParam("密码") @RequestParam("password") @NonNull String password){
        //调用Service
        User user = userService.login(username, password);
        if(user == null){
            //返回错误
            return AppResult.failed(ResultCode.FAILED_LOGIN);
        }

        //获取session对象
        //没有session时创建一个，在里面些true
        HttpSession session = request.getSession(true);
        //把用户信息设置到session中
        //userinfo对于这种可能会多次出现的硬代码，可以考虑定义一个常量
        session.setAttribute(AppConfig.USER_SESSION_KEY,user);
        //返回结果
        return AppResult.success();
    }
}
